0145. 二叉树的后序遍历【简单】
1. 📝 题目描述
给你一棵二叉树的根节点 root,返回其节点值的后序遍历。
示例 1:

txt
输入:root = [1,null,2,3]
输出:[3,2,1]1
2
2
示例 2:
txt
输入:root = []
输出:[]1
2
2
示例 3:
txt
输入:root = [1]
输出:[1]1
2
2
提示:
- 树中节点的数目在范围
[0, 100]内 -100 <= Node.val <= 100
进阶:递归算法很简单,你可以通过迭代算法完成吗?
2. 🎯 s.1 - 递归
js
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var postorderTraversal = function (root) {
const result = []
const traverse = (node) => {
if (!node) return
// 后序遍历:左 -> 右 -> 根
traverse(node.left)
traverse(node.right)
result.push(node.val)
}
traverse(root)
return result
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
js
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var postorderTraversal = function (root, res = []) {
if (!root) return res
postorderTraversal(root.left, res)
postorderTraversal(root.right, res)
res.push(root.val)
return res
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 时间复杂度:
,其中 n 是二叉树的节点数,需要遍历所有节点 - 空间复杂度:
,递归调用栈的深度最多为 n(最坏情况下树退化为链表)
算法思路:
- 后序遍历顺序:左子树 -> 右子树 -> 根节点
- 递归处理:先遍历左子树,再遍历右子树,最后访问根节点
- 将访问的节点值依次存入结果数组
3. 🎯 s.2 - 迭代
js
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var postorderTraversal = function (root) {
if (root === null) return []
const result = []
const stack = [root]
while (stack.length > 0) {
// 弹出栈顶节点并访问,插入到结果数组头部
const node = stack.pop()
result.unshift(node.val)
// 先压入左子节点,再压入右子节点
if (node.left !== null) stack.push(node.left)
if (node.right !== null) stack.push(node.right)
}
return result
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
- 时间复杂度:
,其中 n 是二叉树的节点数,需要遍历所有节点 - 空间复杂度:
,栈的最大深度为 n
算法思路:
- 后序遍历的逆序是:根 -> 右 -> 左,类似前序遍历的镜像
- 按照根-右-左的顺序遍历,将节点值插入到结果数组头部
- 最终得到左-右-根的后序遍历结果